package com.liqi.device.service.impl;

import com.liqi.common.annotation.DataScope;
import com.liqi.common.constant.UserConstants;
import com.liqi.common.utils.DateUtils;
import com.liqi.common.utils.StringUtils;
import com.liqi.common.utils.excel.ExcelUtils;
import com.liqi.device.domain.DvDeviceModule;
import com.liqi.device.domain.DvDrive;
import com.liqi.device.domain.DvModule;
import com.liqi.device.mapper.DvDeviceModuleMapper;
import com.liqi.device.mapper.DvModuleMapper;
import com.liqi.device.service.IDvModuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 模块Service业务层处理
 *
 * @author zhongping
 * @date 2022-02-14
 */
@Service
public class DvModuleServiceImpl implements IDvModuleService {
    @Autowired
    private DvModuleMapper dvModuleMapper;

    @Autowired
    private DvDeviceModuleMapper dvDeviceModuleMapper;

    /**
     * 查询模块
     *
     * @param id 模块主键
     * @return 模块
     */
    @Override
    public DvModule selectDvModuleById(Long id) {
        return dvModuleMapper.selectDvModuleById(id);
    }

    /**
     * 查询模块列表
     *
     * @param dvModule 模块
     * @return 模块
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<DvModule> selectDvModuleList(DvModule dvModule) {
        return dvModuleMapper.selectDvModuleList(dvModule);
    }

    /**
     * 新增模块
     *
     * @param dvModule 模块
     * @return 结果
     */
    @Override
    public int insertDvModule(DvModule dvModule) {
        dvModule.setCreateTime(DateUtils.getNowDate());

        return dvModuleMapper.insertDvModule(dvModule);
    }

    /**
     * 修改模块
     *
     * @param dvModule 模块
     * @return 结果
     */
    @Transactional
    @Override
    public int updateDvModule(DvModule dvModule) {
        DvModule oldModule = dvModuleMapper.selectDvModuleById(dvModule.getId());
        dvModule.setUpdateTime(DateUtils.getNowDate());
        int d = dvModuleMapper.updateDvModule(dvModule);

        //取得旧的设备模块关联数据，然后更新表dv_device_module的模块信息字段
        List<DvDeviceModule> oldDM = dvDeviceModuleMapper.selectDvDeviceModuleByModuleCode(oldModule.getCode());
        if (oldDM != null && oldDM.size() > 0) {
            oldDM.forEach(p -> {
                p.setModuleCode(dvModule.getCode());
                p.setModuleName(dvModule.getName());
                dvDeviceModuleMapper.updateDvDeviceModule(p);
            });
        }
        return d;
    }

    @Override
    public String importModule(List<DvModule> dvModules) {
        StringBuilder sb=new StringBuilder();

        for(DvModule dvModule:dvModules){
            String adapterName = dvModule.getAdapterName();
            String code = dvModule.getCode();
            String name = dvModule.getName();
            String brandCode = dvModule.getBrandCode();
            String brandName = dvModule.getBrandName();
            String model = dvModule.getModel();
            String driveCode = dvModule.getDriveCode();
            String driveName = dvModule.getDriveName();
            String spec = dvModule.getSpec();


            boolean b = ExcelUtils.checkStringIsNull(adapterName, code, name,brandCode,model,driveCode,driveName,brandName,spec);
            if(b==false){
                sb.append("第" + dvModule.getRowNum() + "行：有值未填");
                if (sb.length() > 0 && sb.charAt(sb.length() - 1) == ',') {
                    sb.deleteCharAt(sb.length() -1 );
                }
                sb.append(";<br/>");
            }else {
                DvModule module = dvModuleMapper.checkCodeUnique(code);
                if (module == null) {
                    module = new DvModule();
                    module.setAdapterName(adapterName);
                    module.setDriveName(driveName);
                    module.setDriveCode(driveCode);
                    module.setBrandName(brandCode);
                    module.setCode(code);
                    module.setName(name);
                    module.setModel(model);
                    module.setBrandCode(brandCode);
                    module.setSpec(spec);
                    dvModuleMapper.insertDvModule(dvModule);
                }
            }
        }

        return sb.toString();
    }

    /**
     * 批量删除模块
     *
     * @param ids 需要删除的模块主键
     * @return 结果
     */
    @Override
    public int deleteDvModuleByIds(Long[] ids) {
        return dvModuleMapper.deleteDvModuleByIds(ids);
    }

    /**
     * 删除模块信息
     *
     * @param id 模块主键
     * @return 结果
     */
    @Override
    public int deleteDvModuleById(Long id) {
        return dvModuleMapper.deleteDvModuleById(id);
    }

    /**
     * 校验编码是否唯一
     *
     * @param module 需校验的
     * @return 结果
     */
    @Override
    public String checkCodeUnique(DvModule module) {
        Long configId = StringUtils.isNull(module.getId()) ? -1L : module.getId();
        DvModule info = dvModuleMapper.checkCodeUnique(module.getCode());
        if (StringUtils.isNotNull(info) && info.getId().longValue() != configId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    @Override
    public DvModule selectModuleBycode(String moduleCode) {
        return dvModuleMapper.checkCodeUnique(moduleCode);
    }

}
